package org.hyn.gateway.authorization;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author hyn
 * @version 1.0
 * @description JWT工具类 （JSON Web Tokens）
 * @date 2025/3/15
 */
public class JwtUtil {

    private static final String signingKey = "B*B^5Fe";

    /**
     * 生成 JWT token 字符串
     * @param issuer 签发人
     * @param ttlMillis 有效期
     * @param claims 额外信息
     * @return Token
     */
    public static String encode(String issuer, long ttlMillis, Map<String, Object> claims) {
        if (null == claims) {
            claims = new HashMap<>();
        }

        // 签发时间（iat）：荷载部分的标准字段之一
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        // 签发操作
        JwtBuilder builder = Jwts.builder()
                // 荷载部分。可以包含任意的键值对数据，例如用户ID、用户名等信息。
                .setClaims(claims)
                // 签发时间。即该令牌何时被创建
                .setIssuedAt(now)
                // 签发人；类似 userId、userName。通常是指令牌的发行者或与令牌相关的用户
                .setSubject(issuer)
                // 设置生成签名的算法和秘钥
                .signWith(SignatureAlgorithm.HS256, signingKey);

        if (ttlMillis >+ 0) {
            long expMillis = nowMillis + ttlMillis;
            Date exp = new Date(expMillis);
            // 过期时间（exp）：荷载部分的标准字段之一，代表这个 JWT 的有效期。
            builder.setExpiration(exp);
        }

        return builder.compact();
    }

    /**
     * 获取信息
     * @param token JWT token
     * @return 信息
     */
    public static Claims decode(String token) {
        return Jwts.parser()
                // 设置签名的秘钥
                .setSigningKey(signingKey)
                // 设置需要解析的 jwt
                .parseClaimsJws(token)
                .getBody();
    }

}
